package com.zbkj.service.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.huifu.adapay.Adapay;
import com.huifu.adapay.model.MerConfig;
import com.zbkj.service.param.AdaPayParam;
import com.zbkj.service.service.AdaPayService;
import com.zbkj.service.util.PaymentRegionAndRequestTimeOutUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

@Slf4j
@Service
public class AdaPayServiceImpl implements AdaPayService {
    // adaPay 支付key
    public static String API_KEY = "api_live_538f168a-cf78-4cf6-87fd-85b5f2ddb378";
    // adaPay 支付私钥
    public static String RSA_PRIVATE_KEY = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBANWlBlrrZtKThGOSi3emISgoxEQWY/bcre1n/g/na8el99g9psNhw1rzBxKzWBzNjccnjfvdXVeEs5HVg/rXerFQdKJ6U7svA3ueF4LJwl12ItnDjocX6WeEWWzamMHTaLEfvE/QyaeV7DclGwJQvvDl8Z516iHGAPZBbkWbKClXAgMBAAECgYB0x5q8sfXnXsk74Eup4D45hGcbzJ1hv+i2X2SpbtckL11VbwWrwNGW8kbIew3L2LQJy1458RtnjlrVeT+GKqieKXx3bH6jildBLSc4hSzC/Y8sN97+kk9//R24NF5HMAK55kPHtoLGUDG+GHKf1qwYonHnAsPeI+ubykO6TUplKQJBAPguhHTtKZZnHuBb+VFxeo/DstR9SYxO4d+rQ29Cm1V+KEDkf2Osi0rOSkvwaHwGFUdJkmn4ZFP3PXP5G55QOQ0CQQDcX/rtGIgOWL94hLEfJnU3jUhe7uRzbWYESO7Tmp1U9i0w+/lt50lHfkwij3QusZ3WKiX7lmA9DOPGG42dBYrzAkAi4ocD2IJL/dq9NrBo3kaYBq4QaDv6WOwvAGfOL9KdxcnqtTOi0xIRRcXzvqsxI7nB93l5I80WcF5W+uEC88vRAkADT+n8kEbTOGBAVnY3CqPuXtA8pQiH95f17oawZX2B3mVVfCQGk9hVG7/XMSLE5OSDaITDoEH4CO6PdrCNMJ0jAkApSjyWINkEu/4NL80VoddOEhKl+Y91x8IlxefPDoZ1bNRbAccr0cwLu5msDfYQUjFqA/uWIYkEI2KMB0Xvw1r0";
    public static String APP_ID = "app_51ea5501-2dc7-4521-9727-dfe3db126d5e";

    public JSONObject getPayInfo(AdaPayParam adaPayParam) throws Exception {
        /**
         * debug 模式，开启后有详细的日志
         */
        Adapay.debug = true;

        /**
         * prodMode 模式，默认为生产模式，false可以使用mock模式
         */
        Adapay.prodMode = true;

        /**
         * 初始化商户配置，服务器启动前，必须通过该方式初始化商户配置完成
         * apiKey为prod模式的API KEY
         * mockApiKey为mock模式的API KEY
         * rsaPrivateKey为商户发起请求时，用于请求参数加签所需要的RSA私钥
         */
        MerConfig merConfig = new MerConfig();
        merConfig.setApiKey(API_KEY);
        merConfig.setRSAPrivateKey(RSA_PRIVATE_KEY);
        Adapay.initWithMerConfig(merConfig);
        adaPayParam.setAppId(APP_ID);

        /**
         * 初始化完成，可以开始交易
         */
        // 运行支付类接口
        // String pamentId = PaymentDemo.executePaymentTest(appId);
        // 带区域和超时参数的支付请求Demo
        Map<String, Object> pament = PaymentRegionAndRequestTimeOutUtil.executePayment(adaPayParam);
        log.info("---");
        log.info(pament.get("expend").toString());
        JSONObject jsonObject = JSONObject.parseObject(pament.get("expend").toString());
        log.info("---");
        JSONObject json = JSONObject.parseObject(jsonObject.get("pay_info").toString());
        log.info(json.toString());


        return json;
    }



    public void confirmPay(Map<String, Object> reverseParams) {
        /**
         * debug 模式，开启后有详细的日志
         */
        Adapay.debug = true;

        /**
         * prodMode 模式，默认为生产模式，false可以使用mock模式
         */
        Adapay.prodMode = true;

        /**
         * 初始化商户配置，服务器启动前，必须通过该方式初始化商户配置完成
         * apiKey为prod模式的API KEY
         * mockApiKey为mock模式的API KEY
         * rsaPrivateKey为商户发起请求时，用于请求参数加签所需要的RSA私钥
         */
        MerConfig merConfig = new MerConfig();
        merConfig.setApiKey(API_KEY);
        merConfig.setRSAPrivateKey(RSA_PRIVATE_KEY);
        try {
            Adapay.initWithMerConfig(merConfig);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        try {
            //确认支付
            PaymentRegionAndRequestTimeOutUtil.confirmPay(reverseParams);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }


    public void refund(Map<String, Object> reverseParams) {
        /**
         * debug 模式，开启后有详细的日志
         */
        Adapay.debug = true;

        /**
         * prodMode 模式，默认为生产模式，false可以使用mock模式
         */
        Adapay.prodMode = true;

        /**
         * 初始化商户配置，服务器启动前，必须通过该方式初始化商户配置完成
         * apiKey为prod模式的API KEY
         * mockApiKey为mock模式的API KEY
         * rsaPrivateKey为商户发起请求时，用于请求参数加签所需要的RSA私钥
         */
        MerConfig merConfig = new MerConfig();
        merConfig.setApiKey(API_KEY);
        merConfig.setRSAPrivateKey(RSA_PRIVATE_KEY);
        try {
            Adapay.initWithMerConfig(merConfig);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        reverseParams.put("app_id", APP_ID);
//        reverseParams.put("payment_id", "002112019101810164110031091225392021504");
//        reverseParams.put("reverse_amt", "0.01");
//        reverseParams.put("order_no", "jsdk_reverse" + System.currentTimeMillis());
        try {
            //撤销支付
            PaymentRegionAndRequestTimeOutUtil.cancelPay(reverseParams);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
        try {
            //发起退款
            PaymentRegionAndRequestTimeOutUtil.executeRefund(reverseParams, reverseParams.get("payment_id").toString());
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }

    }


}
